#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<cassert>
using namespace std;

void handler(int signum)
{
    cout<<"捕捉 信号:"<<signum<<endl;
}
void showPending(sigset_t &pending)
{
    for(int sig=1;sig<=31;sig++)
    {
        if(sigismember(&pending,sig))cout<<"1";
        else    cout<<"0";
    }
    cout<<endl;
}
int main()
{
    //0.捕捉2号信号，不要退出
    signal(2,handler);
    //1.定义信号集对象
    sigset_t bset,obset;
    sigset_t pending;
    //2.初始化
    sigemptyset(&bset);//信号集初始化并清空
    sigemptyset(&obset);
    sigemptyset(&pending);
    //3.添加要进行屏蔽的信号
    sigaddset(&bset,2);//SIGINT
    //4.设置set到内核中对应的进程内部[默认情况进程不会对任何信号进行block]
    int n=sigprocmask(SIG_BLOCK,&bset,&obset);
    assert(n==0);
    (void)n;

    cout<<"block 2号信号成功……,pid:"<<getpid()<<endl;
    //5.重复打印当前进程的pending信号集
    int count=0;
    while(true)
    {
        //5.1获取当前进程的pending信号集
        sigpending(&pending);
        //5.2显示pending信号集中的没有被递达的信号
        showPending(pending);
        sleep(1);
        count++;
        if(count==20)
        {
            cout<<"解除对于2号信号的block"<<endl;
            int n=sigprocmask(SIG_SETMASK,&obset,nullptr);
            assert(n==0);
            (void)n;
        }
    }
    return 0;
}